package com.zpark.boot.controller;

import com.zpark.boot.pojo.Person;
import com.zpark.boot.service.IPersonService;
import com.zpark.boot.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.lang.model.element.VariableElement;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * @PackageName: com.zpark.boot.controller
 * @ClassName: PersonController
 * @Description:
 * @author: RZS
 * @date: 2024/4/2  9:00
 */
@RestController
@RequestMapping("/per")
public class PersonController {

    // 自动注入业务层对象
    @Autowired
    private IPersonService personService;

    // 自动注入RedisTemplate
    @Autowired
    private RedisTemplate redisTemplate;

    // 自动注入自定义工具类
    @Autowired
    private RedisUtil redisUtil;


    // 查询所有用户数据
    @GetMapping("/all")
    public List<Person> findAll(){
        // 将擦好像的所有用户数据缓存到redis，数据类型为set
        // 1、先判断redis使用有缓存数据  key => persons
        if (redisUtil.hasKey("persons")) {
            // 如果有，则直接返回
            Set<Object> persons = redisUtil.members("persons");
            // 创建list
            ArrayList<Person> list = new ArrayList<>();
            // 将set集合当中的元素取出，存放到list当中
            for (Object person : persons) {
                // 添加list元素
                list.add((Person) person);
            }

            return list;
        }

        // 如果没有则查询mysql获取数据
        List<Person> personList = personService.findAll();
        // 将mysql查询的数据添加到redis做缓存
        for (Person person : personList) {
            redisUtil.sSet("persons", person);
        }


        return personList;
    }

    // 根据用户名查询用户数据
    @GetMapping("/get_uname")
    public Person findByUsername(String uname){
        // 先从redis当中查询数据
        // 判断查询的uname是否在redis当中，如果在redis当中，则直接从redis当中获取
        // key=>person:uname
        // 判断给定的key是否有值，有则返回true，没有则返回false，本质是判断key是否存在
        if (redisTemplate.hasKey("person:" + uname)) {
            // key存在
            // 从redis当获取数据
            Object o = redisTemplate.opsForValue().get("person:" + uname);
            // 返回数据
            return (Person) o;
        }

        // key不存在，则从mysql当中查询数据
        // 调用持久层查询数据
        Person person = personService.findByUname(uname);
        // 将查询的数据缓存到redis
        redisTemplate.opsForValue().set("person:" + uname, person);

        return person;
    }

    /*@GetMapping("/get_uname")
    public Person findByUsername(String uname){
        // 先从redis当中查询数据

        // 调用持久层查询数据
        Person person = personService.findByUname(uname);

        // 将数据保持到redis当中
        redisTemplate.opsForValue().set("person:" + person.getId(), person);

        // 获取redis当中的数据
        Object o = redisTemplate.opsForValue().get("person:" + person.getId());

        return (Person) o;
    }*/


}
